#ifndef DATARECORDMODEL_H
#define DATARECORDMODEL_H

#include <QAbstractListModel>
#include <QQueue>
#include <QMutex>
#include "entities/DataPoint.h"

/**
 * @brief 实时数据记录模型
 * @details 继承 QAbstractListModel，为 QML 提供实时数据：
 *          - 管理内存缓存队列（FIFO，最近 N 条数据）
 *          - 支持多设备数据分离管理
 *          - 自动通知 QML 界面刷新（用于实时曲线图）
 *          - 线程安全（支持采集线程写入）
 *          - 支持按设备 ID 过滤数据
 */
class DataRecordModel : public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(int count READ count NOTIFY countChanged)
    Q_PROPERTY(int maxRecords READ maxRecords WRITE setMaxRecords NOTIFY maxRecordsChanged)
    Q_PROPERTY(QString currentDeviceId READ currentDeviceId WRITE setCurrentDeviceId NOTIFY currentDeviceIdChanged)

public:
    // 角色枚举（对应 QML 中的属性）
    enum DataRoles
    {
        IdRole = Qt::UserRole + 1, // 数据ID
        DeviceIdRole,              // 设备ID
        TimestampRole,             // 时间戳
        TemperatureRole,           // 温度（℃）
        PressureRole,              // 压力（kPa）
        FlowRole                   // 流量（L/min）
    };
    Q_ENUM(DataRoles)

    explicit DataRecordModel(QObject *parent = nullptr);
    ~DataRecordModel();

    // QAbstractListModel 必须实现的方法
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QHash<int, QByteArray> roleNames() const override;

    // 数据数量
    int count() const;

    // 最大记录数（超出则移除最旧的）
    int maxRecords() const { return m_maxRecords; }
    void setMaxRecords(int maxRecords);

    // 当前设备 ID（用于过滤显示）
    QString currentDeviceId() const { return m_currentDeviceId; }
    void setCurrentDeviceId(const QString &deviceId);

    // 添加数据点（线程安全）
    Q_INVOKABLE void addDataPoint(const DataPoint &dataPoint);
    Q_INVOKABLE void addDataPoint(const QString &deviceId, double temperature, double pressure, double flow);

    // 批量添加数据点（线程安全）
    Q_INVOKABLE void addDataPoints(const QList<DataPoint> &dataPoints);

    // 获取数据点
    Q_INVOKABLE DataPoint getDataPoint(int index) const;

    // 获取最新数据点
    Q_INVOKABLE DataPoint getLatestDataPoint() const;
    Q_INVOKABLE DataPoint getLatestDataPointForDevice(const QString &deviceId) const;

    // 获取指定设备的所有数据点
    Q_INVOKABLE QList<DataPoint> getDataPointsForDevice(const QString &deviceId) const;

    // 获取温度/压力/流量数据数组（用于图表）
    Q_INVOKABLE QList<double> getTemperatureData() const;
    Q_INVOKABLE QList<double> getPressureData() const;
    Q_INVOKABLE QList<double> getFlowData() const;
    Q_INVOKABLE QStringList getTimestampData() const;

    // 获取指定设备的数据数组（用于图表）
    Q_INVOKABLE QList<double> getTemperatureDataForDevice(const QString &deviceId) const;
    Q_INVOKABLE QList<double> getPressureDataForDevice(const QString &deviceId) const;
    Q_INVOKABLE QList<double> getFlowDataForDevice(const QString &deviceId) const;
    Q_INVOKABLE QStringList getTimestampDataForDevice(const QString &deviceId) const;

    // 清空数据
    Q_INVOKABLE void clear();

    // 清空指定设备的数据
    Q_INVOKABLE void clearDeviceData(const QString &deviceId);

signals:
    // 数据数量变化信号
    void countChanged();

    // 最大记录数变化信号
    void maxRecordsChanged();

    // 当前设备 ID 变化信号
    void currentDeviceIdChanged();

    // 新数据点添加信号
    void dataPointAdded(const QString &deviceId);

    // 数据更新信号（用于通知 QML 刷新图表）
    void dataUpdated();

private:
    // 过滤后的数据列表（用于当前设备）
    QList<DataPoint> getFilteredDataPoints() const;

    // 移除超出限制的旧数据
    void trimOldRecords();

private:
    QQueue<DataPoint> m_dataQueue; // 数据队列（FIFO）
    mutable QMutex m_mutex;        // 互斥锁（线程安全）
    int m_maxRecords;              // 最大记录数（默认 200）
    QString m_currentDeviceId;     // 当前设备 ID（用于过滤）
};

#endif // DATARECORDMODEL_H
